<?php
import('$/util/store_type.php');

/**
 * 图片存储功能相关操作类
 *
 * URL: /img/10ea204a9ea416c/100.jpg
 * 每个文件URL里会带storage.key方便取文件
 * 图片文件尺寸定义到配置里，用ID代替，并以ID做为取图片尺寸的依据
 *
 * Storage -> (StorageHelper:) ImageStorageHelper <- Image
 * ImageStorageHelper文件负责处理图片大小，保存位置，根据参数动态生成其它尺寸
 * Image 处理图片文件的底层库
 * Storage 存储文件的底层库
 * StorageHelper 存取文件的权限检查，修改验证等
 *
 * @author xyma
 *
 */
class ImageStorageHelper
{
	/**
	 * 根据key取得图片，并按尺寸生成缩略图
	 * 图片尺寸cache到本地，可放到tmp或哪里，根据文件key生成路径
	 * 图片缓存被控制，缓存方式定义到setting.cache_thumb，另外临时关闭的函数$cache
	 */
	static function getThumb($key, $size, $cache=1)
	{
		if(empty($key)||empty($size)){
			return false;
		}
		
		$ctype	=	app_cfg('setting', 'cache_thumb');
		$cpath	=	'';
		
		//检查缩略图是否被缓存过
		if($cache && 2==$ctype)
		{
			$cpath	=	app_cfg('setting', 'thumb_path'). self::getCachePath($key, $size);
			if(file_exists($cpath))
			{
				return file_get_contents($cpath);
			}
		}
		
		//取原图位置
		$srcimg	=	app_cfg('setting', 'store_path') .Storage::key2path($key);
		if(!file_exists($srcimg)){
			return false;
		}
		
		//检查如果是取源图就不走thumb方法了
		if('00'===$size){
			return file_get_contents($srcimg);
		}
		
		//取到缩略图尺寸定义
		$cfg	=	app_cfg('imgcfg', 'imgsize');
		$fsize	=	$cfg[$size];
		if($fsize)
		{
			list($x,$y,)	=	$fsize;
			
			//缓存缩略图
			if($cache && $cpath)
			{
				if(!file_exists(dirname($cpath))){
					mkdir(dirname($cpath), 0755, true);
				}
				ImageHelper::thumb($srcimg, $x, $y, $cpath);
				return file_get_contents($cpath);
			}
			else
			{
				$tmpfile	=	tempnam(TMP_PATH, 'thumb_');
				ImageHelper::thumb($srcimg, $x, $y, $tmpfile);
				$imgstr	=	file_get_contents($tmpfile);
				unlink($tmpfile);
				return $imgstr;
			}
		}
		else
		{
			return false;
		}
	}

	/**
	 * 限定图片最大尺寸和输出格式(jpeg)
	 *
	 * @return bool
	 */
	static function convertImage($srcimg, $dstimg)
	{
		$info	=	ImageHelper::getImageInfo($srcimg);
		if(!$info){
			//可能不是图片，或不支持的图片格式
			return false;
		}
		
		//控制图片文件最大尺寸
		list($maxWidth, $maxHeight)	=	app_cfg('imgcfg', 'maxsize_pic');
		if( ($maxWidth && $maxWidth < $info['width'])
			|| ($maxHeight && $maxHeight < $info['height'])
		){
			ImageHelper::thumb($srcimg, $maxWidth, $maxHeight, $dstimg);
		}
		else{
			//否则只转换图片格式为jpeg
			ImageHelper::convert($srcimg, $dstimg);
		}
		
		return true;
	}
	
	/**
	 * 添加图片存储
	 *
	 * @param $upfile array	图片上传的$_FILES数组
	 * @return string 返回存储的key
	 */
	static function addStock($upfile, &$error=null)
	{
		if(!is_uploaded_file($upfile['tmp_name']))
		{
			$error	=	'上传文件失败';
			return false;
		}
		
		$imgfile	=	$upfile['tmp_name'];
		$name		=	$upfile['name'];
		
		$data		=	array();
		if(false!==strrpos($name, '.')){
			$data['name']	=	substr($name, 0, strrpos($name,'.')).'.jpg';
		}
		else{
			$data['name']	=	$name.'.jpg';
		}
		
		$info	=	ImageHelper::getImageInfo($imgfile);
		if(!$info){
			$error	=	'可能不是图片，或不支持的图片格式';
			return false;
		}
		
		//控制图片文件最大尺寸
		$tmpfile	=	tempnam(TMP_PATH, 'thumb2_');
		ImageStorageHelper::convertImage($imgfile, $tmpfile);
		
		$data['c_type']	=	$info['mime'];
		$data['type']	=	STORE_IMAGE;
		$data['mode']	=	0;
		if(!empty($upfile['node_id'])){
			$data['node_id']	=	$upfile['node_id'];
		}
		
		//保存到存储服务器 name,c_type,type,mode
		$r	=	Storage::add($data, file_get_contents($tmpfile));
		unlink($tmpfile);
		
		if($r){
			return $r['key'];
		}
		else{
			$error	=	'存储失败';
			return false;
		}
	}
	
	/**
	 * 删除一条图片存储信息
	 * @return bool
	 */
	static function dropStock($key)
	{
		return Storage::delete($key) && self::purgeCache($key);
	}
	
	/**
	 * 修改图片存储信息
	 */
	static function modifyStock()
	{
		
	}
	
	/**
	 * 生成图片缩略图的缓存路径，若$size非空则返回此尺寸文件路径，无则返回存储目录路径
	 * 不检查文件是否存在
	 *
	 * @param $key string Storage.key
	 * @param $size string 尺寸
	 */
	static function getCachePath($key, $size=null)
	{
		return sprintf('/%s/%s/%s%s', substr($key, 2,1), substr($key, 3, 2), substr($key, 5), ($size?"/{$size}.jpg":''));
	}
	
	/**
	 * 清除指定图片文件缓存（原图、缩略图），包括前端缓存服务的cache
	 * 缓存情况有两种：见 conf/setting.cache_thumb
	 */
	static function purgeCache($key)
	{
		/**
		 * @todo 在删除缓存目录时还有问题，原图删除了，缓存目录及图片还存在
		 */
//		if(strlen($key)!=15){
//			return false;
//		}
		$c	=	app_cfg('setting', 'cache_thumb');
		if($c)
		{
			if(2==$c)
			{
				dropdir(sprintf('/%s/%s/%s', substr($key, 2,1), substr($key, 3, 2), substr($key, 5)));
			}
			return VarnishHelper::purgeStock(substr($key, 2));
		}
		return true;
	}
	
	
}
?>